'use strict'
const path = require ('path')
const defaultSettings = require ('./src/settings.js')
const FileWebpackPlugin = require ('filemanager-webpack-plugin')

function resolve(dir) {
  return path.join (__dirname, dir)
}

const name = defaultSettings.title || '项目管理' // page title

const port = process.env.port || process.env.npm_config_port || 9528 // dev port

module.exports = {

  publicPath: process.env.NODE_ENV === 'production' ? '/hr-xc-human-resources-perform-manage/' : './',
  outputDir: 'dist',
  assetsDir: 'static',
  lintOnSave: process.env.NODE_ENV === 'development',
  productionSourceMap: false,
  // 以下是pwa配置
  pwa: {
    iconPaths: {
      favicon32: 'favicon.ico',
      favicon16: 'favicon.ico',
      appleTouchIcon: 'favicon.ico',
      maskIcon: 'favicon.ico',
      msTileImage: 'favicon.ico'
    }
  },
  devServer: {
    port: port,
    headers: {
      'Access-Control-Allow-Origin': '*'
    },
    overlay: {
      warnings: false,
      errors: true
    },
    proxy: {
      '/hr-xc-human-resources-perform-manage': {
        target: 'http://127.0.0.1:8877',
        changeOrigin: true
      },
    },
    disableHostCheck: true
  },
  configureWebpack: config => {
    if (process.env.NODE_ENV === 'production') {
      config.optimization.minimizer[0].options.terserOptions.compress.drop_console = true
    }
    if (process.env.NODE_ENV !== 'development') {
      config.plugins.push (new FileWebpackPlugin ({
        onStart: {
          delete: [path.join (__dirname, 'dist.zip')]
        },
        onEnd: {
          archive: [
            {
              source: path.join (__dirname, 'dist'),
              destination: path.join (__dirname, 'dist.zip')
            }
          ]
        }
      }))
    }
    return {
      name: name,
      resolve: {
        alias: {
          '@': resolve ('src')
        }
      }
    }
  },
  chainWebpack(config) {
    config.plugins.delete ('preload')

    config.plugins.delete ('prefetch') // TODO: need test

    // set svg-sprite-loader
    config.module
      .rule ('svg')
      .exclude.add (resolve ('src/icons'))
      .end ()
    config.module
      .rule ('icons')
      .test (/\.svg$/)
      .include.add (resolve ('src/icons'))
      .end ()
      .use ('svg-sprite-loader')
      .loader ('svg-sprite-loader')
      .options ({
        symbolId: 'icon-[name]'
      })
      .end ()

    // set preserveWhitespace
    config.module
      .rule ('vue')
      .use ('vue-loader')
      .loader ('vue-loader')
      .tap (options => {
        options.compilerOptions.preserveWhitespace = true
        return options
      })
      .end ()

    config
      // https://webpack.js.org/configuration/devtool/#development
      .when (process.env.NODE_ENV === 'development',
        config => config.devtool ('cheap-source-map')
      )

    config
      .when (process.env.NODE_ENV !== 'development',
        config => {
          config
            .plugin ('ScriptExtHtmlWebpackPlugin')
            .after ('html')
            .use ('script-ext-html-webpack-plugin', [{

              inline: /runtime\..*\.js$/
            }])
            .end ()
          config
            .optimization.splitChunks ({
            chunks: 'all',
            cacheGroups: {
              libs: {
                name: 'chunk-libs',
                test: /[\\/]node_modules[\\/]/,
                priority: 10,
                chunks: 'initial' // only package third parties that are initially dependent
              },
              echarts: {
                name: 'chunk-echarts',
                priority: 20,
                test: /[\\/]node_modules[\\/]_?echarts(.*)/
              },
              elementUI: {
                name: 'chunk-elementUI', // split elementUI into a single package
                priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
                test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
              },
              commons: {
                name: 'chunk-commons',
                test: resolve ('src/components'), // can customize your rules
                minChunks: 3, //  minimum common number
                priority: 5,
                reuseExistingChunk: true
              }
            }
          })
          config.optimization.runtimeChunk ('single')
        }
      )
  }
}
